package com.wanho.qz103.hrsaas.commons.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.wanho.qz103.hrsaas.commons.exception.DataAccessException;
import lombok.extern.slf4j.Slf4j;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * 获得 数据库 连接  释放
 */
@Slf4j
public class JDBCUtil {

    /**数据库：数据源*/
    private static DataSource dataSource ;
    /**二级缓存： 本地线程 */
    private static ThreadLocal<Connection> local = new ThreadLocal<>() ;

    /**
     * 只执行一次： 读取 jdbc.properties  磁盘读入内存 耗时 硬读 到 软读
     */
    static{
        try {
            // 输入流
            InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties") ;
            // Properties 类 工具类 加载数据
            Properties prop = new Properties();
            // 读取数据
            prop.load(is);
            // 创建数据源
            dataSource = DruidDataSourceFactory.createDataSource(prop);
            log.debug("数据源连接池创建成功！！！");
        } catch (IOException e) {
            e.printStackTrace();
            log.error("读取目标文件失败！！！");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("创建数据源连接池失败！！！");
        }
    }
    /**
     * 获得数据库连接
     * @return
     */
    public static Connection getConnection() throws DataAccessException {
        try {
            // 尝试从二级缓存中 获得连接
            Connection connection = local.get();
            //如果没有拿到 连接对象
            if (connection==null) {
                // 从一级缓存 中获得
                connection = dataSource.getConnection();
                // 设置 二级缓存中
                local.set(connection);
            }
            return connection ;
        } catch (SQLException e) {
            e.printStackTrace();
            log.error("获得数据库连接失败！！！");
            throw new DataAccessException(e.getMessage()) ;
        }
    }

    /**
     * 关闭数据库连接
     * @param conn
     */
    public static void closeConnection(Connection conn) throws DataAccessException{
        try {
            if (conn!=null && !conn.isClosed()) {
                //从二级缓存中移除
                local.remove();
                //释放连接
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
            log.error("关闭数据库连接失败！！！");
            throw new DataAccessException(e.getMessage()) ;
        }
    }
}
